"""
配置管理模块
负责管理系统和用户配置
"""

import json
import os
from typing import Dict, Any, Optional


class ConfigManager:
    """
    配置管理器
    负责加载、保存和管理系统配置
    """
    
    def __init__(self, config_file: str = "config.json"):
        """
        初始化配置管理器
        
        Args:
            config_file: 配置文件路径
        """
        self.config_file = config_file
        self.config = {}
        self.default_config = {
            # 音频配置
            'audio': {
                'sample_rate': 44100,
                'chunk_size': 1024,
                'channels': 1,
                'format': 'int16',
                'beat_sensitivity': 1.5
            },
            
            # 机器人配置
            'robot': {
                'address': '192.168.1.100',
                'port': 8080,
                'connection_type': 'tcp',
                'timeout': 5.0
            },
            
            # WiFi配置（用于ESP32串口配置）
            'wifi_config': {
                'ssid': '',
                'password': '',
                'static_ip': '',
                'gateway': '',
                'subnet': '255.255.255.0'
            },
            
            # 界面配置
            'ui': {
                'theme': 'default',
                'window_width': 1024,
                'window_height': 768,
                'show_waveform': True,
                'show_features': True
            },
            
            # 舞蹈模式配置
            'dance_mode': {
                'default_mode': 'realtime',
                'preset_sequences_path': './sequences',
                'recordings_path': './recordings'
            },
            
            # 性能配置
            'performance': {
                'max_history_points': 1000,
                'update_interval_ms': 50,
                'buffer_size': 100
            },
            
            # 讯飞语音识别配置
            'xfyun': {
                'app_id': 'afed0bdd',
                'api_key': '8900a3deaab7ae489182e5503cb535d2',
                'api_secret': 'ZjEyNTgwMjc4YzdlOGNkMDkyYzI0YThj'
            }
        }
        
        # 加载配置
        self.load_config()
        
    def load_config(self):
        """从文件加载配置"""
        try:
            if os.path.exists(self.config_file):
                with open(self.config_file, 'r', encoding='utf-8') as f:
                    self.config = json.load(f)
            else:
                # 如果配置文件不存在，使用默认配置
                self.config = self.default_config.copy()
                self.save_config()
        except Exception as e:
            print(f"加载配置文件失败: {e}")
            # 使用默认配置
            self.config = self.default_config.copy()
            
    def save_config(self):
        """保存配置到文件"""
        try:
            with open(self.config_file, 'w', encoding='utf-8') as f:
                json.dump(self.config, f, ensure_ascii=False, indent=2)
        except Exception as e:
            print(f"保存配置文件失败: {e}")
            
    def get(self, key_path: str, default=None) -> Any:
        """
        获取配置值
        
        Args:
            key_path: 配置键路径，例如 'audio.sample_rate'
            default: 默认值
            
        Returns:
            配置值
        """
        keys = key_path.split('.')
        value = self.config
        
        try:
            for key in keys:
                value = value[key]
            return value
        except (KeyError, TypeError):
            # 如果找不到配置项，返回默认值或默认配置中的值
            try:
                default_value = self.default_config
                for key in keys:
                    default_value = default_value[key]
                return default_value
            except (KeyError, TypeError):
                return default
                
    def set(self, key_path: str, value: Any):
        """
        设置配置值
        
        Args:
            key_path: 配置键路径，例如 'audio.sample_rate'
            value: 配置值
        """
        keys = key_path.split('.')
        config = self.config
        
        # 导航到倒数第二层
        for key in keys[:-1]:
            if key not in config:
                config[key] = {}
            config = config[key]
            
        # 设置值
        config[keys[-1]] = value
        
    def get_section(self, section: str) -> Dict[str, Any]:
        """
        获取配置节
        
        Args:
            section: 配置节名称
            
        Returns:
            Dict[str, Any]: 配置节内容
        """
        return self.config.get(section, {})
        
    def update_section(self, section: str, values: Dict[str, Any]):
        """
        更新配置节
        
        Args:
            section: 配置节名称
            values: 要更新的值字典
        """
        if section not in self.config:
            self.config[section] = {}
            
        self.config[section].update(values)
        
    def reset_to_default(self):
        """重置为默认配置"""
        self.config = self.default_config.copy()
        self.save_config()
        
    def get_all_config(self) -> Dict[str, Any]:
        """
        获取所有配置
        
        Returns:
            Dict[str, Any]: 所有配置
        """
        return self.config.copy()


# 全局配置管理器实例
config_manager = ConfigManager()


def get_config_manager() -> ConfigManager:
    """
    获取全局配置管理器实例
    
    Returns:
        ConfigManager: 配置管理器实例
    """
    return config_manager